過濾器Filter是Spring Boot當中非常強大的機制,能夠用在處理請求和響應時的預先或事後處理,也就是透過Filter,可以控制在前端請求進入API之前,或是API處理完響應返回給前端之前,執行其他邏輯處理,很常應用於log日誌、數據格式化或驗證會員身分等等,能夠提升程式的安全性或是有效能監控的功能。
日誌記錄:用來記錄每個請求的相關資訊,例如請求的URL、方法、參數等,對於除錯或監控很有用。
身份驗證:用來檢查用戶是否具有登入或適當權限,未通過者,會直接於過濾器被阻擋,無法進入到控制層。(驗證身分,使用攔截器會更適合)
數據格式化:可以用來修改請求或響應的數據格式,例如把請求參數轉換為統一的格式,或者於響應返回前先進行資料的壓縮。
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 記錄請求的開始時間
long startTime = System.currentTimeMillis();
// 繼續處理接下來的過濾器或控制器
chain.doFilter(request, response);
// 記錄請求的結束時間
long endTime = System.currentTimeMillis();
// 計算並輸出請求處理時間
System.out.println("Request processed in " + (endTime - startTime) + " ms");
}
}
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<LoggingFilter> loggingFilter() {
FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new LoggingFilter());
registrationBean.addUrlPatterns("/api/*"); // 加入要過濾的路徑
return registrationBean;
}
}
Filter過濾器的概念不限於Spring Boot
過濾器是屬於Java Servlet規範之一,只要是使用Java Servlet技術的伺服器,如Tomcat,都可以使用過濾器。而透過Spring Boot,過濾器更容易上手使用,因有對其集成與配置,使用上更加簡化,只要使用@Configuration、@Bean註解即可完成過濾器的註冊和配置,不用透過像是web.xml等文件處理:
未使用Spring Boot,而在任何Java EE或Servlet規範應用時,使用web.xml中配置過濾器:
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>